package jp.co.nes.awssupport.common.utility;

import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.security.spec.InvalidKeySpecException;
import java.util.Date;

import com.amazonaws.services.cloudfront.CloudFrontUrlSigner;
import com.amazonaws.services.cloudfront.util.SignerUtils;

/**
 * CloudFrontヘルパーです。<br>
 * CloudFrontに関する機能を提供します。
 */
public class AwsCloudFrontHelper {

    /**
     * デフォルトコンストラクタです。
     */
    public AwsCloudFrontHelper() {
    }

    /**
     * CloudFrontへの認証URLを作成します。
     *
     * @param protocol CloudFront通信プロトコル(HTTP,HTTPS,RTMP)
     * @param domainName CloudFrontドメイン名
     * @param keyPairPrivateKeyFilePath CloudFrontキーペアprivateファイル名(フルパス)
     * @param objectKey 公開するファイルのs3オブジェクトキー
     * @param keyPairId CloudFrontキーペアID
     * @param expirationDate 有効期限
     * @param charSet url変換文字列
     * @return 認証つきURL
     */
    public String generateSignedURL(String protocol, String domainName, String keyPairPrivateKeyFilePath,
            String objectKey, String keyPairId, Date expirationDate, String charSet)
            throws InvalidKeySpecException, IOException {

        SignerUtils.Protocol targetProtocol;

        if ("https".equals(protocol.toLowerCase())) {
            targetProtocol = SignerUtils.Protocol.https;
        } else if ("rtmp".equals(protocol.toLowerCase())) {
            targetProtocol = SignerUtils.Protocol.rtmp;
        } else {
            targetProtocol = SignerUtils.Protocol.http;
        }

        // オブジェクトキーを事前にURLエンコード化しておく
        StringBuilder sb = new StringBuilder("");
        for (String path : objectKey.split("/")) {
            if (sb.length() != 0) {
                sb.append("/");
            }
            sb.append(URLEncoder.encode(path, charSet));
        }
        String objKey = sb.toString();

        File privateKeyFile = new File(keyPairPrivateKeyFilePath);

        String retURL = CloudFrontUrlSigner.getSignedURLWithCannedPolicy(
                targetProtocol, // 通信プロトコル
                domainName, // CloudFrontのDomain
                privateKeyFile, // CloudFront認証情報のPrivate Keyファイルオブジェクト
                objKey, // S3のbucket以下のオブジェクトキー
                keyPairId, // CloudFront認証情報のキーペアID
                expirationDate); // 有効期限

        return retURL;
    }
}
